package com.example.toolsdemo.tools;

import android.text.TextUtils;
import android.util.Log;

/**
 * ClassName:LoggerUtils
 * Description:
 * 设置日志开关
 * 设置日志自定义tag
 * 为log添加堆栈信息
 *
 * @date: 2021/6/10 17:01
 * @author: Wang Wanquan
 * @mail WongWonquanMail@gmail.com
 */
public class LoggerUtils {

    /**
     * 开关
     */
    private static boolean isDebug = false;
    /**
     * 自定义信息
     */
    private static String TAG = "";


    public static void init(boolean debug) {
        isDebug = debug;
    }


    public static void setTag(String tag) {
        if (!TextUtils.isEmpty(tag)) {
            TAG = tag;
        }
    }


    public static void i(String msg) {
        if (isDebug) {
            //输出信息头+日志
            Log.i(getHeader(), msg);
        }
    }

    public static void d(String msg) {
        if (isDebug) {
            //输出信息头+日志
            Log.d(getHeader(), msg);
        }
    }

    public static void w(String msg) {
        if (isDebug) {
            //输出信息头+日志
            Log.w(getHeader(), msg);
        }
    }


    public static void e(String msg) {
        if (isDebug) {
            //输出信息头+日志
            Log.e(getHeader(), msg);
        }
    }


    /**
     * 获取日志输出header
     *
     * @return 自定义tag+堆栈信息
     */
    private static String getHeader() {
        return TAG + getLineInfo();
    }


    /**
     * 获取堆栈信息
     *
     * @return 堆栈信息
     */
    private static String getLineInfo() {
        StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
        //获取日志所在方法的类
        String clazz = stackTraceElements[5].getClassName();
        //如果有一连串包名,只包留最后一个类名
        String[] path = clazz.split("\\.");
        if (path.length > 0) {
            clazz = path[path.length - 1];
        }
        //获取日志类所在的方法名
        String method = stackTraceElements[5].getMethodName();
        //获取日志在调用类中的代码行数
        int line = stackTraceElements[5].getLineNumber();
        //按照  [类名].[方法名](line:[行数])的格式拼接日志信息头
        return String.format("%s.%s(line:%s):", clazz, method, line);
    }
}
